package com.greentravel.dao;

import com.greentravel.model.TravelRecord;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 出行记录数据访问对象接口
 * 定义对出行记录数据的操作方法
 */
public interface TravelRecordDAO {

    /**
     * 添加出行记录
     * 
     * @param record 出行记录对象
     * @return 是否添加成功
     */
    boolean addTravelRecord(TravelRecord record);

    /**
     * 根据记录ID删除出行记录
     * 
     * @param id 记录ID
     * @return 是否删除成功
     */
    boolean deleteTravelRecord(int id);

    /**
     * 更新出行记录信息
     * 
     * @param record 出行记录对象
     * @return 是否更新成功
     */
    boolean updateTravelRecord(TravelRecord record);

    /**
     * 根据记录ID查询出行记录
     * 
     * @param id 记录ID
     * @return 出行记录对象
     */
    TravelRecord getTravelRecordById(int id);

    /**
     * 根据用户ID查询所有出行记录
     * 
     * @param userId 用户ID
     * @return 出行记录列表
     */
    List<TravelRecord> getTravelRecordsByUserId(int userId);

    /**
     * 查询所有出行记录
     * 
     * @return 出行记录列表
     */
    List<TravelRecord> getAllTravelRecords();

    /**
     * 根据日期范围查询用户出行记录
     * 
     * @param userId    用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 出行记录列表
     */
    List<TravelRecord> getTravelRecordsByDateRange(int userId, Date startDate, Date endDate);

    /**
     * 根据出行方式查询用户出行记录
     * 
     * @param userId     用户ID
     * @param travelMode 出行方式
     * @return 出行记录列表
     */
    List<TravelRecord> getTravelRecordsByTravelMode(int userId, String travelMode);

    /**
     * 统计用户出行总里程
     * 
     * @param userId 用户ID
     * @return 总里程
     */
    double getTotalDistanceByUserId(int userId);

    /**
     * 统计用户碳减排总量
     * 
     * @param userId 用户ID
     * @return 碳减排总量
     */
    double getTotalCarbonReductionByUserId(int userId);

    /**
     * 统计不同出行方式的使用次数
     * 
     * @param userId 用户ID
     * @return 出行方式及对应的使用次数
     */
    Map<String, Integer> getTravelModeStatistics(int userId);

    /**
     * 获取用户的平均出行距离
     * 
     * @param userId 用户ID
     * @return 平均出行距离
     */
    double getAverageDistanceByUserId(int userId);
}